<?php
declare (strict_types = 1);

namespace app\middleware;

use app\exception\TokenExpiredException;
use InvalidArgumentException;
use think\Response;
use app\model\User as UserModel;

class Check
{
    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    public function handle($request, \Closure $next)
    {

        // 请求路径
        $url = $request->url();

        // token
        $token = $request->header('token','');

        // 如果是登录请求 或 验证登录状态的请求 则放行
        if($url == '/user/login' || $url == '/user/isLogin'){
            return $next($request);
        }

        // 如果不是登录请求 或 验证登录状态的请求，且没有token的话，拦截请求
        if(empty($token)){

            // 拦截请求，返回 JSON 错误响应
            return Response::create([
                'code' => 401,
                'msg'  => '未登录'
            ], "json");

        }else{

            // 不是登录请求 或 验证登录状态的请求，但是携带了token的话,验证token是否过期
            try {
                $result = UserModel::isLogin($token);

                // token有效，存储用户信息
                $request->user = $result['user'];

            }catch (TokenExpiredException $e){

                // 登录过期
                return Response::create([
                    'code' => $e->getCode(),
                    'msg'  => $e->getMessage()
                ], "json");

            }catch (\Exception $e){
                // 系统异常
                return Response::create([
                    'code' => 500,
                    'msg'  => '系统错误'
                ], "json",500);
            }

            // 验证通过，放行
            return $next($request);
        }
    }
}
